package com.indeed.proctor.webapp.tags;
import com.indeed.proctor.store.Revision;
import com.indeed.proctor.webapp.extensions.DefinitionRevisionDisplayFormatter;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.ServletContext;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.util.Map;
/**
*/
public class FormatDefinitionRevisionDisplayTagHandler extends TagSupport {
private static final Logger LOGGER = Logger.getLogger(FormatDefinitionRevisionDisplayTagHandler.class);
private Revision revision;
public void setRevision(final Revision revision) {
this.revision = revision;
}
public int doStartTag() {
try {
pageContext.getOut().print(formatRevisionDisplay(revision));
} catch (IOException e) {
LOGGER.error("Failed to write formatted revision to page context", e);
}
return SKIP_BODY;
}
public String formatRevisionDisplay(final Revision revision) {
final String defaultFormattedRevision = revision.getAuthor() + " @ " + revision.getDate() + " (" + revision.getRevision() + ")";
final ServletContext servletContext = pageContext.getServletContext();
final WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
try {
final Map<String, DefinitionRevisionDisplayFormatter> formatterBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context,DefinitionRevisionDisplayFormatter.class);
if (formatterBeans.isEmpty()) {
//No bean found, which is acceptable.
return StringEscapeUtils.escapeHtml(defaultFormattedRevision);
} else if (formatterBeans.size() == 1) {
DefinitionRevisionDisplayFormatter formatter = formatterBeans.values().iterator().next();
return formatter.formatRevision(revision);
} else {
throw new IllegalArgumentException("Multiple beans of type " + DefinitionRevisionDisplayFormatter.class.getSimpleName() + " found, expected 0 or 1.");
}
} catch (Exception e) {
LOGGER.error("An error occurred when retrieving revision url.", e);
return defaultFormattedRevision;
}
}
}